package trim.calc;

import java.io.IOException;
import java.io.InputStream;
import trim.Trim;
import trim.TrimException;
import trim.calc.smdata.StaticPatternsTrimSMData;
import trim.common.inputdata.InputData;
import trim.common.result.TrimResult;
import trim.common.sm.SMException;
import trim.common.sm.SimpleTrimSMData;
import trim.common.sm.TrimSimplex;
import trim.common.utils.Utils;

/**
 * Создан 14.10.2009 16:44:30
 * @author Дмитрий
 */
public class SMStaticPatternsRoundUpTrim extends Trim
{

  public SMStaticPatternsRoundUpTrim()
  {
  }

  @Override
  public TrimResult solve(InputData inputData) throws TrimException
  {
    try
    {
      inputData=Utils.groupInputData(inputData).clone();
      TrimSimplex sm=new TrimSimplex(new StaticPatternsTrimSMData(inputData));
      sm.solve();
      System.out.println("SMStaticPatternsRoundUpTrim ofValue="+sm.getObjectiveFunctionValue());
      new Round().round(sm);
      TrimResult tr=sm.getTrimResult();
      return tr;
    }catch(SMException ex)
    {
      throw new TrimException("Error in SM",ex);
    }
  }

  /**
   * Класс передназначенный для округления решения СМ
   */
  private class Round
  {

    int[] additions;
    double[] res1;
    int minm;
    double[] objFunc;
    TrimSimplex sm;
    int n;

    Round()
    {
    }

    void round(TrimSimplex sm)
    {
      this.sm=sm;
      objFunc=sm.getObjectiveFunction();
      n=objFunc.length;
      additions=new int[n];
      int c=0;
      for(int i=0;i<n;i++)
      {
        additions[i]=(objFunc[i]-Math.floor(objFunc[i]+1e-10))>1e-10?1:0;
        objFunc[i]=Math.floor(objFunc[i]+1e-10);
        c+=additions[i];
      }
      for(int i=0;i<n;i++)
        objFunc[i]=Math.floor(objFunc[i]+1e-10)+additions[i];

    }
  }

  @Override
  public String getName()
  {
    return this.getClass().getSimpleName();
  }

  @Override
  public String getVersion()
  {
    InputStream is=getClass().getResourceAsStream("/trim/calc/version");
    byte[] b=new byte[20];
    try
    {
      int n=is.read(b);
      return new String(b,0,n);
    }catch(IOException ex)
    {
      ex.printStackTrace();
      return "0";
    }
  }

  @Override
  public String getDescription()
  {
    return "Округление решения СМ вверх";
  }
}
